package top.lshaci.learning.springboot.jpaquerydsl.core;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.querydsl.core.types.Order;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.ComparableExpressionBase;
import com.querydsl.core.types.dsl.EntityPathBase;

import java.util.Arrays;
import java.util.Objects;

import static com.google.common.base.Ascii.equalsIgnoreCase;

/**
 * DslOrderUtil
 *
 * @author liangxu
 */
public class DslOrderUtil {

    /**
     * 构建 DSL 排序信息
     *
     * @param sort    排序信息
     * @param fromObj 排序字段所在的对象
     * @return DSL 排序信息
     */
    public static OrderSpecifier<?>[] sort(String sort, EntityPathBase<?> fromObj) {
        OrderSpecifier<?>[] orders = doSort(sort, fromObj);
        return ArrayUtil.isEmpty(orders) ? DslQuery.ORDER_EMPTY : orders;

    }

    /**
     * 执行构建 DSL 排序信息
     *
     * @param sort    排序信息
     * @param fromObj 排序字段所在的对象
     * @return DSL 排序信息
     */
    private static OrderSpecifier<?>[] doSort(String sort, EntityPathBase<?> fromObj) {
        if (StrUtil.isBlank(sort)) {
            return DslQuery.ORDER_EMPTY;
        }
        return Arrays.stream(sort.split("[,;]"))
                .filter(StrUtil::isNotBlank)
                .map(StrUtil::trim)
                .map(v -> {
                    String[] va = v.split(StrUtil.UNDERLINE);
                    ComparableExpressionBase<?> field = (ComparableExpressionBase<?>) ReflectUtil.getFieldValue(fromObj, va[0].trim());
                    if (field == null) {
                        return null;
                    }
                    return va.length == 1 || equalsIgnoreCase(Order.ASC.name(), va[1].trim()) ? field.asc() : field.desc();
                }).filter(Objects::nonNull).toArray(OrderSpecifier[]::new);
    }
}
